'''
包pyjwt的使用：                载荷，密钥，加密算法
>> import jwt
>> encoded_jwt = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
>> encoded_jwt
  'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'

>> jwt.decode(encoded_jwt, 'secret', algorithms=['HS256'])
  {'some': 'payload'}
  jwt是信息加密的一种方式,一个JWT由三个部分组成:header（包含算法）,
                                          payload（需要传递的数据）,
                                          signature（通过密钥将前两部分加密，称为签名，作用防止篡改）
  服务端保存密钥，载荷传递数据加密到签名部分生成jwt传递到前端
  前端发送所携带jwt，服务器通过密钥解密，对比签名部分与解密后的数据是否相符
  前端：jwt,后端：只保存密钥
'''

import jwt
from flask import current_app
from toutiao import Config

# 生成的token 必须要有 过期时间,一旦生成无法删除，只能等到过期
def generate_jwt(payload,expiry,secret=None):
    '''

    :param payload: dict 载荷(传递的数据在这部分)
    :param expiry: datetime 有效期
    :param secret: 密钥
    :return: jwt
    '''
    _payload={'exp':expiry}
    _payload.update(payload) #将payload字典内容添加进——payload

    if secret is None:
        secret = Config.JWT_SECRET

    token = jwt.encode(_payload,secret,algorithm='HS256')
    return token.decode()

#解码
def verify_jwt(token,secret=None):

    if secret is None:
        secret = Config.JWT_SECRET
    try:
        payload = jwt.decode(token,secret,algorithms=['HS256'])
    except Exception:
        #token有异常
        return None
    else:
        return payload
